#include "pwm.h"

/***************************
* 函数名： TIM3_CH2_PWM_Init
* 功能：TIM3通道2 PWM初始化函数
* 输入：per：重装载值
			  psc：分频系数
* 输出：无
*/
void TIM3_CH2_PWM_Init(u16 per,u16 psc)
{
	TIM_HandleTypeDef TIM3_Handler;											// 定时器句柄
	TIM_OC_InitTypeDef TIM3_CH2Handler;									// 定时器3通道2句柄
	
	TIM3_Handler.Instance = TIM3;												// 定时器3
	TIM3_Handler.Init.Prescaler = psc;									// 定时器分频
	TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;	// 向上计数模式
	TIM3_Handler.Init.Period = per;											// 自动重装载值
	TIM3_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;	// 时钟分频
	HAL_TIM_PWM_Init(&TIM3_Handler);										// 初始化PWM
	
	TIM3_CH2Handler.OCMode = TIM_OCMODE_PWM1;						// 模式选择PWM1
	TIM3_CH2Handler.Pulse = per / 2;										// 设置比较值，此值用来确定占空比，默认比较值为自动重装载值的一半，即占空比为50%
	TIM3_CH2Handler.OCPolarity = TIM_OCPOLARITY_LOW;		// 输出比较极性为低
	HAL_TIM_PWM_ConfigChannel(&TIM3_Handler, &TIM3_CH2Handler, TIM_CHANNEL_2);	// 配置TIM3通道2
	
	HAL_TIM_PWM_Start(&TIM3_Handler, TIM_CHANNEL_2);		// 开启PWM通道2
	
}

/************************************
* 定时器底层驱动，时钟使能，引脚配置
* 该函数会被HAL_TIM_PWM_Init()调用
* htim：定时器句柄
************************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	__HAL_RCC_TIM3_CLK_ENABLE();						// 使能定时器3
	__HAL_RCC_AFIO_CLK_ENABLE();						// 使能AFIO时钟，要在TIM映射时钟前使能（复用IO时钟）
	__HAL_AFIO_REMAP_TIM3_PARTIAL();				// TIM3通道引脚部分重映射使能
	__HAL_RCC_GPIOB_CLK_ENABLE();						// 开启GPIOB时钟
	
	GPIO_InitStructure.Pin = GPIO_PIN_5;							// PB5
	GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;				// 复用推挽输出
	GPIO_InitStructure.Pull = GPIO_PULLUP;						// 上拉
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;	// 高速
	HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
}

// 设置TIM通道2占空比
// compare：比较值
void TIM3_SetCompare2(u32 compare)
{
	TIM3->CCR2 = compare;
}